以下的內容都是我個人的理解,如果有理解錯誤或有造成誤解的地方在麻煩請糾正
而這邊就是是主要要談得以下概念首先不外乎就是要講要怎麼使用 Ray Cluster ,另外要怎麼設定才能指定特定的Function 放到 Ray Cluster 分散 就是接下來要談的內容
首先當然要對於 Ray Cluster 來先說明,對 Ray Ecosystem 而言,主要就是有一個負責管理 Task 跟 Node 的 Head Node,還有幫忙處理事情的一堆 Workers ,首先第一個問題
怎麼把 function push 到 ray cluster 給不同的 node 來執行呢?
就是要在最前面 設定 ray.init
的部分下需要 remote host ,然後 connect 一直在的狀況下,就會把很多Ray task 丟到 remote host 上面處理並且分散出去。
為什麼 Worker 上面的 Environment 怎麼去執行 Ray task ?
其實以 worker 跟 head node 的執行環境,基本上的 package 也都要設定為一樣的,因為這樣才有辦法 import package in the program, 所以為了要讓 script 的執行可以順利找到 package ,所以就要設定workdir ,這樣才會讓 package path 固定,才不至於會變成 not found function.
這邊Ray 的部分主要就要先建立 Connection ,然後建立 Connection 到 Ray head 之後,就可以把需要執行的東西丟到 Ray Cluster 去執行計算,所以在下面的 code 第一個就是表示建立 ray connection。
import ray
ray.init() # 預設是會起 localhost 的 ray cluster
ray.init("ray://ray-head-svc:10001/", workdir="./") # 這是指向到 Ray Cluster Head 的上面
在 ray.init 的部分除了建立 connection 之外,同時也可以加入 workdir ,這點需要加入是因為分散的時候可能會也會需要使用local file ,所以這邊也是 import 進來,不然會導致後面執行的時候找不到 function
然後第二個 code 就是當程式執行到 remote 的話,就會丟進去 Ray remote去執行
@ray.remote
def DoSomethingOnRay():
print("do something")
DoSomethingOnRay.remote() # 簡單地分開去執行 DoSomethingOnRay
@ray.remote
def GetSomethingOnRay(i):
return f"get {i}"
getSomething = []
for i in range(10):
getSomething.append(GetSomethingOnRay.remote(i)) # 用 list 去接 return 結果
resultList = ray.get(getSomething) # 等待 ray 執行的結果
這邊用兩種方法來說明,前面那個比較簡單就是單純呼叫 ray 去執行,而後面的那個就是把參數帶去 ray cluster 去進算,然後最後的 ray.get
的部分就是等待 ray clsuter 把所有的function 執行完然後再回傳到 resultList